import { Notice } from 'view-design'
const Pub = {}

/**
 * @description 动态注册组件
 * @param {Array} arr 组件相关数据
 */
Pub.dynamicComps = function dynamicComps (arr) {
    let comps = {}
    arr.forEach(item => {
        comps[item.fileName] = () =>
      import(`@/components/${item.fileUrl}/formItem/${item.fileName}.vue`)
    })
    return comps
}

/**
 * @description 动态添加路由
 * @param {Object} obj 路由相关内容
 * @param {String} type 路由添加类型 默认是list,还有 view,edit,add
 */
Pub.dynamicRouter = function dynamicRouter (obj, type = 'list') {
    let routers = []
    let pageType = 'List'
    if (type === 'view') {
        pageType = 'View'
    } else if (type === 'edit') {
        pageType = 'Edit'
    } else if (type === 'add') {
        pageType = 'Add'
    }
    for (let k in obj) {
        routers.push({
            path: k,
            name: k.replace(/\//g, '-').substr(1),
            meta: {
                auth: true, // 是否校验权限
                title: obj[k].pageTitle
            },
            component: () =>
        import(`@/pages/basePage/base${pageType}/base${pageType}`)
        })
    }
    return routers
}

/**
 * @description 动态混入mixinjs
 * @param {String} path 从顶级mixins目录开始 如： '/mixins/app'
 */
Pub.dynamicMixins = function dynamicMixins (path) {
    let mx = require(`@${path}`)
    return mx
}

/**
 * @description 列表查看详情操作
 * @param {Object} obj 路由相关内容
 * @param {Object} data 列表单行数据
 * @param {String} path 跳转基础路径
 */
Pub.View = (obj, data, path) => {
    if (obj.handleType === 'link') {
        let jumpPath = path + obj.name
        obj.requestParams.forEach((item, index) => {
            if (index === Number('0')) {
                jumpPath += '?' + item + '=' + data[item]
            } else {
                jumpPath += '&' + item + '=' + data[item]
            }
        })
        return jumpPath
    }
}

/**
 * @description 列表编辑操作
 * @param {Object} obj 列表新增对象信息
 * @param {String} path 跳转基础路径
 */
Pub.Add = (obj, path) => {
    if (obj.handleType === 'link') {
        let jumpPath = path + obj.name
        return jumpPath
    }
}

/**
 * @description 列表编辑操作
 * @param {Object} obj 列表单行操作对象
 * @param {Object} data 列表单行数据
 * @param {String} path 跳转基础路径
 */
Pub.Edit = (obj, data, path) => {
    if (obj.handleType === 'link') {
        let jumpPath = path + obj.name
        obj.requestParams.forEach((item, index) => {
            if (index === Number('0')) {
                jumpPath += '?' + item + '=' + data[item]
            } else {
                jumpPath += '&' + item + '=' + data[item]
            }
        })
    }
}

/**
 * @description 列表审核操作
 * @param {Object} obj 列表单行操作对象
 * @param {Object} data 列表单行数据
 * @param {String} path 跳转基础路径
 */
Pub.Audit = (obj, data, path) => {
    if (obj.handleType === 'link') {
        let jumpPath = path + obj.name
        obj.requestParams.forEach((item, index) => {
            if (index === Number('0')) {
                jumpPath += '?' + item + '=' + data[item]
            } else {
                jumpPath += '&' + item + '=' + data[item]
            }
        })
    } else {
        Notice.warning({
            title: '弹出窗.'
        })
    }
    // return path
}

/**
 * 存储数据
 * @param {string}         name     存储对象名，必选
 * @param {string/JSON}    data     存储对象值，必选
 * @param {string}         type     存储方式，可选。 值为 “1” 则是 sessionStorage，否则为 localStorage
 */
Pub.setStorageSync = (name, data, type) => {
    if (!name) return
    if (typeof data !== 'string') {
        data = JSON.stringify(data)
    }
    if (!isStorageSupported()) {
        // 无痕模式情况下用cookie存储
        Pub.setCookie(name, data)
    } else if (type === '1') {
        sessionStorage.setItem(name, data)
    } else {
        localStorage.setItem(name, data)
    }
}

/**
 * 获取数据
 * @param {string}     name     获取对象名，必选
 * @param {string}     type     获取方式，可选。 值为 “1” 则是 sessionStorage，否则为 localStorage
 * @return {string}             返回值，string 类型。 如果需要JSON对象，在拿到数据后可以对数据进行 JSON.parse() 处理
 */
Pub.getStorageSync = (name, type) => {
    if (!name) return
    let data
    if (!isStorageSupported()) {
        // 无痕模式情况取cookie存储
        data = Pub.getCookie(name)
    } else if (type === '1') {
        data = sessionStorage.getItem(name)
    } else {
        data = localStorage.getItem(name)
    }
    return data
}

/**
 * 移除数据
 */
Pub.removeStorageSync = name => {
    if (!name) return
    Pub.setCookie(name, null)
    sessionStorage.removeItem(name)
    localStorage.removeItem(name)
}

/**
 * 数据Cookie设置，浏览器开启无痕浏览不支持本地存储时使用
 */
Pub.setCookie = (cname, value, expiredays) => {
    var exdate = new Date()
    exdate.setDate(exdate.getDate() + expiredays)
    document.cookie =
        cname +
        '=' +
        escape(value) +
        (expiredays == null ? '' : ';expires=' + exdate.toGMTString())
}

/**
 * H5数据Cookie获取，浏览器开启无痕浏览不支持本地存储时使用
 */
Pub.getCookie = (cname) => {
    if (document.cookie.length > 0) {
        let cstart = document.cookie.indexOf(cname + '=')
        if (cstart !== -1) {
            cstart = cstart + cname.length + 1
            let cend = document.cookie.indexOf(';', cstart)
            if (cend === -1) cend = document.cookie.length
            return unescape(document.cookie.substring(cstart, cend))
        }
    }
    return ''
}

/**
 * 判断ios 是不是无痕模式，如果是则返回true
 */
function isStorageSupported () {
    if (typeof localStorage === 'object') {
        try {
            localStorage.setItem('localStorage', 1)
            localStorage.removeItem('localStorage')
            return true
        } catch (e) {
            Storage.prototype._setItem = Storage.prototype.setItem
            Storage.prototype.setItem = function () {}
        }
        return false
    }
}

/**
 * 获取多长时间前或后的日期
 * @param {number}     num     获取对象名，必选 0：当天，-1：一天后，-2：两天后，1：一天前，2：两天前
 * @param {string}     time     获取方式，可选。 指定日期 不传为当前日期
 * @return {string}             返回值，string 类型。
 */
Pub.getBeforeDate = (num, time) => {
    let n = num > 0 ? num - 1 : num < 0 ? num + 1 : num
    let d = ''
    if (time) {
        d = new Date(time)
    } else {
        d = new Date()
    }
    let year = d.getFullYear()
    let mon = d.getMonth() + 1
    let day = d.getDate()
    if (day <= n) {
        if (mon > 1) {
            mon = mon - 1
        } else {
            year = year - 1
            mon = 12
        }
    }
    d.setDate(d.getDate() - n)
    year = d.getFullYear()
    mon = d.getMonth() + 1
    day = d.getDate()
    let s =
        year +
        '-' +
        (mon < 10 ? '0' + mon : mon) +
        '-' +
        (day < 10 ? '0' + day : day)
    return s
}

/**
 * 根据时间戳获取日期时间
 * @param {number}     date     	时间戳, 可选。为空 代表当前日期
 * @param {string}     type     			拼接格式，可选。默认“-” 2019-11-29
 * @return {boolean}   showTime       是否显示时间，可选。默认 true   2019-11-29 10:10:10
 */
Pub.getDateTime = (date = '', type = '-', showTime = true) => {
    let data = new Date();
    if (date !== '') {
        data = new Date(date);
    }
    let yy = data.getFullYear();
    let mm = data.getMonth() + 1 < 10 ? '0' + (data.getMonth() + 1) : data.getMonth() + 1;
    let dd = data.getDate() < 10 ? '0' + data.getDate() : data.getDate();
    let hh = data.getHours() < 10 ? '0' + data.getHours() : data.getHours();
    let mf = data.getMinutes() < 10 ? '0' + data.getMinutes() : data.getMinutes();
    let ss = data.getSeconds() < 10 ? '0' + data.getSeconds() : data.getSeconds();
    let time = '';
    if (showTime) {
        time = yy + type + mm + type + dd + ' ' + hh + ':' + mf + ':' + ss;
    } else {
        time = yy + type + mm + type + dd;
    }
    return time
}

export default Pub
